home *** CD-ROM | disk | FTP | other *** search
/ HyperLib 1997 Winter - Disc 1 / HYPERLIB-1997-Winter-CD1.ISO.7z / HYPERLIB-1997-Winter-CD1.ISO / オンラインウェア / PRG / PL 2.0 SupplementDoc Folder.sit / PL 2.0 SupplementDoc Folder / Documentation / Chapter 20. The Evaluator < prev    next >
Text File  |  1995-03-28  |  14KB  |  333 lines

  1. Common Lisp the Language, 2nd Edition
  2. -------------------------------------------------------------------------------
  3.  
  4. 20. The Evaluator
  5.  
  6. The mechanism that executes Lisp programs is called the evaluator. More
  7. precisely, the evaluator accepts a form and performs the computation specified
  8. by the form. This mechanism is made available to the user through the function
  9. eval.
  10.  
  11. The evaluator is typically implemented as an interpreter that traverses the
  12. given form recursively, performing each step of the computation as it goes. An
  13. interpretive implementation is not required, however. A permissible alternative
  14. approach is for the evaluator first to completely compile the form into
  15. machine-executable code and then invoke the resulting code. This technique
  16. virtually eliminates incompatibilities between interpreted and compiled code
  17. but also renders the evalhook mechanism relatively useless. Various mixed
  18. strategies are also possible. All of these approaches should produce the same
  19. results when executing a correct program but may produce different results for
  20. incorrect programs. For example, the approaches may differ as to when macro
  21. calls are expanded; macro definitions should not depend on the time at which
  22. they are expanded. Implementors should document the evaluation strategy for
  23. each implementation.
  24.  
  25. -------------------------------------------------------------------------------
  26.  
  27.    *  Run-Time Evaluation of Forms
  28.    *  The Top-Level Loop
  29.  
  30. -------------------------------------------------------------------------------
  31.  
  32. 20.1. Run-Time Evaluation of Forms
  33.  
  34. The function eval is the main user interface to the evaluator. Hooks are
  35. provided for user-supplied debugging routines to obtain control during the
  36. execution of an interpretive evaluator. The functions evalhook and applyhook
  37. provide alternative interfaces to the evaluator mechanism for use by these
  38. debugging routines.
  39.  
  40. [Function]
  41. eval form
  42.  
  43. The form is evaluated in the current dynamic environment and a null lexical
  44. environment. Whatever results from the evaluation is returned from the call to
  45. eval.
  46.  
  47. Note that when you write a call to eval two levels of evaluation occur on the
  48. argument form you write. First the argument form is evaluated, as for arguments
  49. to any function, by the usual argument evaluation mechanism (which involves an
  50. implicit use of eval). Then the argument is passed to the eval function, where
  51. another evaluation occurs. For example:
  52.  
  53. (eval (list 'cdr (car '((quote (a . b)) c)))) => b
  54.  
  55. The argument form (list 'cdr (car '((quote (a . b)) c))) is evaluated in the
  56. usual way to produce the argument (cdr (quote (a . b))); this is then given to
  57. eval because eval is being called explicitly, and eval evaluates its argument
  58. (cdr (quote (a . b))) to produce b.
  59.  
  60. If all that is required for some application is to obtain the current dynamic
  61. value of a given symbol, the function symbol-value may be more efficient than
  62. eval.
  63.  
  64. [change_begin]
  65. X3J13 voted in January 1989 (MAPPING-DESTRUCTIVE-INTERACTION)   to restrict
  66. user side effects; see section 7.9.
  67. [change_end]
  68.  
  69. [Variable]
  70. *evalhook* 
  71. *applyhook*
  72.  
  73. If the value of *evalhook* is not nil, then eval behaves in a special way. The
  74. non-nil value of *evalhook* should be a function that takes two arguments, a
  75. form and an environment; this is called the eval hook function. When a form is
  76. to be evaluated (any form at all, even a number or a symbol), whether
  77. implicitly or via an explicit call to eval, no attempt is made to evaluate the
  78. form. Instead, the hook function is invoked and is passed the form to be
  79. evaluated as its first argument. The hook function is then responsible for
  80. evaluating the form; whatever is returned by the hook function is assumed to be
  81. the result of evaluating the form.
  82.  
  83. The variable *applyhook* is similar to *evalhook* but is used when a function
  84. is about to be applied to arguments. If the value of *applyhook* is not nil,
  85. then eval behaves in a special way.
  86.  
  87. [old_change_begin]
  88. The non-nil value of *applyhook* should be a function that takes three
  89. arguments: a function, a list of arguments, and an environment; this is called
  90. the apply hook function.
  91. [old_change_end]
  92.  
  93. [change_begin]
  94. X3J13 voted in January 1989 (APPLYHOOK-ENVIROMENT)   to revise the definition
  95. of *applyhook*. Its value should be a function of two arguments, a function and
  96. a list of arguments; no environment information is passed to an apply hook
  97. function.
  98. [change_end]
  99.  
  100. This was simply a flaw in the first edition. Sorry about that.
  101.  
  102. When a function is about to be applied to a list of arguments, no attempt is
  103. made to apply the function. Instead, the hook function is invoked and is passed
  104. the function and the list of arguments as its first and second arguments. The
  105. hook function is then responsible for evaluating the form; whatever is returned
  106. by the hook function is assumed to be the result of evaluating the form. The
  107. apply hook function is used only for application of ordinary functions within
  108. eval. It is not used for applications via apply or funcall, for applications by
  109. such functions as map or reduce, or for invocation of macro-expansion functions
  110. by either eval or macroexpand.
  111.  
  112. [change_begin]
  113. X3J13 voted in June 1988 (FUNCTION-TYPE)   to specify that the value of
  114. *macroexpand-hook* is first coerced to a function before being called as the
  115. expansion interface hook. This vote made no mention of *evalhook* or
  116. *applyhook*, but this may have been an oversight.
  117.  
  118. A proposal was submitted to X3J13 in September 1989 to specify that the value
  119. of *evalhook* or *applyhook* is first coerced to a function before being
  120. called. If this proposal is accepted, the value of either variable may be nil,
  121. any other symbol, a lambda-expression, or any object of type function.
  122. [change_end]
  123.  
  124. The last argument passed to either kind of hook function contains information
  125. about the lexical environment in an implementation-dependent format. These
  126. arguments are suitable for the functions evalhook, applyhook, and macroexpand.
  127.  
  128. When either kind of hook function is invoked, both of the variables *evalhook*
  129. and *applyhook* are rebound to the value nil around the invocation of the hook
  130. function. This is so that the hook function will not be invoked recursively on
  131. evaluations and applications that occur in the course of executing the code of
  132. the hook function. The functions evalhook and applyhook are useful for
  133. performing recursive evaluations and applications within the hook function.
  134.  
  135. The hook feature is provided as an aid to debugging. The step facility is
  136. implemented using this hook.
  137.  
  138. If a non-local exit causes a throw back to the top level of Lisp, perhaps
  139. because an error could not be corrected, then *evalhook* and *applyhook* are
  140. automatically reset to nil as a safety feature.
  141.  
  142. [Function]
  143.  
  144. evalhook form evalhookfn applyhookfn &optional env
  145. applyhook function args evalhookfn applyhookfn &optional env
  146.  
  147. The functions evalhook and applyhook are provided to make it easier to exploit
  148. the hook feature.
  149.  
  150. In the case of evalhook, the form is evaluated. In the case of applyhook, the
  151. function is applied to the list of arguments args. In either case, for the
  152. duration of the operation the variable *evalhook* is bound to evalhookfn, and
  153. *applyhook* is bound to applyhookfn. Furthermore, the env argument is used as
  154. the lexical environment for the operation; env defaults to the null
  155. environment. The check for a hook function is bypassed for the evaluation of
  156. the form itself (for evalhook) or for the application of the function to the
  157. args itself (for applyhook), but not for subsidiary evaluations and
  158. applications such as evaluations of subforms. It is this one-shot bypass that
  159. makes evalhook and applyhook so useful.
  160.  
  161. [change_begin]
  162. X3J13 voted in January 1989 (APPLYHOOK-ENVIROMENT)   to eliminate the optional
  163. env parameter to applyhook, because it is not (and cannot) be useful. Any
  164. function that can be applied carries its own environment and does not need
  165. another environment to be specified separately. This was a flaw in the first
  166. edition.
  167. [change_end]
  168.  
  169. Here is an example of a very simple tracing routine that uses just the evalhook
  170. feature.
  171.  
  172. (defvar *hooklevel* 0)
  173.  
  174. (defun hook (x)
  175.   (let ((*evalhook* 'eval-hook-function))
  176.     (eval x)))
  177.  
  178. (defun eval-hook-function (form &rest env)
  179.   (let ((*hooklevel* (+ *hooklevel* 1)))
  180.     (format *trace-output* "~%~V@TForm:  ~S"
  181.             (* *hooklevel* 2) form)
  182.     (let ((values (multiple-value-list
  183.                      (evalhook form
  184.                                #'eval-hook-function
  185.                                nil
  186.                                env))))
  187.       (format *trace-output* "~%~V@TValue:~{ ~S~}"
  188.               (* *hooklevel* 2) values)
  189.       (values-list values))))
  190.  
  191. Using these routines, one might see the following interaction:
  192.  
  193. (hook '(cons (floor *print-base* 2) 'b))
  194.   Form:  (CONS (FLOOR *PRINT-BASE* 2) (QUOTE B))
  195.     Form:  (FLOOR *PRINT-BASE* 3)
  196.       Form:  *PRINT-BASE*
  197.       Value: 10
  198.       Form:  3
  199.       Value: 3
  200.     Value: 3 1
  201.     Form:  (QUOTE B)
  202.     Value: B
  203.   Value: (3 . B)
  204. (3 . B)
  205.  
  206. [Function]
  207. constantp object
  208.  
  209. If the predicate constantp is true of an object, then that object, when
  210. considered as a form to be evaluated, always evaluates to the same thing; it is
  211. a constant. This includes self-evaluating objects such as numbers, characters,
  212. strings, bit-vectors, and keywords, as well as all constant symbols declared by
  213. defconstant, such as nil, t, and pi. In addition, a list whose car is quote,
  214. such as (quote foo), is considered to be a constant.
  215.  
  216. If constantp is false of an object, then that object, considered as a form,
  217. might or might not always evaluate to the same thing.
  218.  
  219. -------------------------------------------------------------------------------
  220.  
  221. 20.2. The Top-Level Loop
  222.  
  223. Normally one interacts with Lisp through a ``top-level read-eval-print loop,''
  224. so called because it is the highest level of control and consists of an endless
  225. loop that reads an expression, evaluates it, and prints the results. One has an
  226. effect on the state of the Lisp system only by invoking actions that have side
  227. effects.
  228.  
  229. The precise nature of the top-level loop for Common Lisp is purposely not
  230. rigorously specified here so that implementors can experiment to improve the
  231. user interface. For example, an implementor may choose to require
  232. line-at-a-time input, or may provide a fancy editor or complex graphics-display
  233. interface. An implementor may choose to provide explicit prompts for input, or
  234. may choose (as MacLisp does) not to clutter up the transcript with prompts.
  235.  
  236. The top-level loop is required to trap all throws and recover gracefully. It is
  237. also required to print all values resulting from evaluation of a form, perhaps
  238. on separate lines. If a form returns zero values, as little as possible should
  239. be printed.
  240.  
  241. The following variables are maintained by the top-level loop as a limited
  242. safety net, in case the user forgets to save an interesting input expression or
  243. output value. (Note that the names of some of these variables violate the
  244. convention that names of global variables begin and end with an asterisk.)
  245. These are intended primarily for user interaction, which is why they have short
  246. names. Use of these variables should be avoided in programs.
  247.  
  248. [Variable]
  249.  
  250. ++ 
  251. +++
  252.  
  253. While a form is being evaluated by the top-level loop, the variable + is bound
  254. to the previous form read by the loop. The variable ++ holds the previous value
  255. of + (that is, the form evaluated two interactions ago), and +++ holds the
  256. previous value of ++.
  257.  
  258. [Variable]
  259.  
  260.  
  261. While a form is being evaluated by the top-level loop, the variable - is bound
  262. to the form itself; that is, it is the value about to be given to + once this
  263. interaction is done.
  264.  
  265. [change_begin]
  266. Notice of correction. In the first edition, the name of the variable - was
  267. inadvertently omitted.
  268. [change_end]
  269.  
  270. [Variable]
  271.  
  272. ** 
  273. ***
  274.  
  275. While a form is being evaluated by the top-level loop, the variable * is bound
  276. to the result printed at the end of the last time through the loop; that is, it
  277. is the value produced by evaluating the form in +. If several values were
  278. produced, * contains the first value only; * contains nil if zero values were
  279. produced. The variable ** holds the previous value of * (that is, the result
  280. printed two interactions ago), and *** holds the previous value of **.
  281.  
  282. If the evaluation of + is aborted for some reason, then the values associated
  283. with *, **, and *** are not updated; they are updated only if the printing of
  284. values is at least begun (though not necessarily completed).
  285.  
  286. [Variable]
  287.  
  288. // 
  289. ///
  290.  
  291. While a form is being evaluated by the top-level loop, the variable / is bound
  292. to a list of the results printed at the end of the last time through the loop;
  293. that is, it is a list of all values produced by evaluating the form in +. The
  294. value of * should always be the same as the car of the value of /. The variable
  295. // holds the previous value of / (that is, the results printed two interactions
  296. ago), and /// holds the previous value of //. Therefore the value of ** should
  297. always be the same as the car of //, and similarly for *** and ///.
  298.  
  299. If the evaluation of + is aborted for some reason, then the values associated
  300. with /, //, and /// are not updated; they are updated only if the printing of
  301. values is at least begun (though not necessarily completed).
  302.  
  303. As an example of the processing of these variables, consider the following
  304. possible transcript, where > is a prompt by the top-level loop for user input:
  305.  
  306. >(cons - -)             ;Interaction 1
  307. ((CONS - -) CONS - -)   ;Cute, huh?
  308.  
  309. >(values)               ;Interaction 2
  310.                         ;Nothing to print
  311.  
  312. >(cons 'a 'b)   ;Interaction 3
  313. (A . B)                 ;There is a single value
  314.  
  315. >(hairy-loop)^G ;Interaction 4
  316. ### QUIT to top level.  ;(User aborts the computation.)
  317.  
  318. >(floor 13 4)   ;Interaction 5
  319. 3                       ;There are two values
  320.  
  321.  
  322. At this point we have:
  323.  
  324. +++ => (cons 'a 'b)   *** => NIL      /// => ()
  325. ++ => (hairy-loop)    ** => (A . B)   // => ((A . B))
  326. + => (floor 13 4)     * => 3          / => (3 1)
  327.  
  328. -------------------------------------------------------------------------------
  329.  
  330.  
  331.  
  332.  
  333.